#pragma once
#include <iostream>
#include <string>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sstream>
#include "Log.hpp"

class Util
{
public:
    // 坑：一般网页文件，都是文本的，如果是图片的话，中间就不会出现\0，字符串就出现丢失
    // 但是如果是图片，视频，音频-> 二进制的,如果是图片的话，中间就不会出现\0，字符串就出现丢失,所以要按照二进制的方式读取
    static bool ReadFile(const std::string &path, std::string *fileContent) // 读取整个文件内容
    {
        // 1. 获取文件本身的大小
        struct stat st;//里面是一些属性
        int n = stat(path.c_str(), &st);//怎么获取文件大小呢，首先要打开文件，还要读取，就有stat接口，获取文件的一些属性，path.c_str()是文件路经
        if (n < 0)
            return false;
        int size = st.st_size;//文件中的其中一个属性，文件大小
        // 2. 调整string的空间
        fileContent->resize(size);
        // 3. 读取
        int fd = open(path.c_str(), O_RDONLY);
        if (fd < 0)
            return false;
        read(fd, (char *)fileContent->c_str(), size);//把整个文件的内容读到了这个字符串流fileContent所指定的内存缓冲区的起始地址
        close(fd);
        logMessage(Info, "read file %s done", path.c_str());
        return true;
    }
    static std::string ReadOneLine(std::string &message, const std::string &sep)
    {
        auto pos = message.find(sep);
        if (pos == std::string::npos)
            return "";
        std::string s = message.substr(0, pos);//下次在读的时候，我要从第二行开始读，所以我要把massage中内容进行清空erase
        message.erase(0, pos + sep.size());//后面还有\r\n，所以要加sep.size()
        return s;
    }
    // GET /favicon.ico HTTP/1.1
    // GET /a/b/c/d/e/f/g/h/i/g/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z HTTP/1.1  请求方法，请求资源，请求版本
    static bool ParseRequestLine(const std::string &line, std::string *method, std::string *url, std::string *httpVersion)//把一行内容解析成三个部分
    {
        std::stringstream ss(line);//stringstream：默认就是也空格为单位，把内容提取
        ss >> *method >> *url >> *httpVersion;//打到三个流中
        return true;
    }
};